﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using CRC.GestionSalones.Dominio.Clases;
using System.Collections;

namespace CRC.Comun.Presentacion
{
    public class ControladorGestionCategorias
    {
        private static String strQryCategorias = "select c.Id, c.Nombre from Categoria c";
        private static String strQryExisteCatConNombre = "select count(*) from Categoria cat where cat.Nombre = :nombre";
        private static String strQryCatConFotos = "select count(*) from Foto f inner join f.Categoria cat where cat.Id= :idCat";

        public IList<Object[]> listarCategorias()
        {
            ISession session = NHibernate.NHibernateHelper.GetCurrentSession();

            try
            {
                return session.CreateQuery(strQryCategorias).List<Object[]>();
            }
            catch (HibernateException he)
            {
                if (session != null) session.Close();
                throw he;
            }
        }

        public int nuevaCategoria(String pStrNombre)
        {
            ISession session = null;
            ITransaction tx = null;
            try
            {
                session = NHibernate.NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();

                IQuery qry = session.CreateQuery(strQryExisteCatConNombre).SetParameter("nombre", pStrNombre);
                IList res = qry.List();
                if (((long)res[0]) > 0) throw new ApplicationException("La categoría ya existe");

                Categoria cat = new Categoria(pStrNombre);

                session.Save(cat);
                tx.Commit();

                return cat.Id;
            }
            catch (HibernateException he)
            {
                if (tx != null) tx.Rollback();
                if (session != null) session.Close();
                throw he;
            }
        }

        public void renombrar(int pIntCat, String pStrNuevNombre)
        {
            ISession session = null;
            ITransaction tx = null;
            try
            {
                session = NHibernate.NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();

                Categoria cat = (Categoria)session.Get(typeof(Categoria), pIntCat);
                
                //Si nuevo nombre es diferente  entonces comprovar no repeticion
                if (pStrNuevNombre.CompareTo(cat.Nombre) != 0)
                {
                    IQuery qry = session.CreateQuery(strQryExisteCatConNombre).SetParameter("nombre", pStrNuevNombre);
                    IList res = qry.List();
                    if (((long)res[0]) > 0) throw new ApplicationException("La categoría ya existe");
                }

                cat.Nombre = pStrNuevNombre;

                session.Update(cat);
                tx.Commit();
            }
            catch (HibernateException he)
            {
                if (tx != null) tx.Rollback();
                if (session != null) session.Close();
                throw he;
            }
        }

        public void eliminarCategoria(int pIntCat)
        {
            ISession session = null;
            ITransaction tx = null;
            try
            {
                session = NHibernate.NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();

                IList res = session.CreateQuery(strQryCatConFotos).SetParameter("idCat", pIntCat).List();
                if ((long)res[0] > 0) throw new ApplicationException("No es posible eliminar. Existen fotos pertenecientes a la categoría en uno o varios salones.");

                Categoria cat = (Categoria)session.Get(typeof(Categoria), pIntCat);
                session.Delete(cat);

                tx.Commit();
            }
            catch (HibernateException he)
            {
                if (tx != null) tx.Rollback();
                if (session != null) session.Close();
                throw he;
            }
        }
    }
}
